<?php
//рус
include_once (_CORE_PATH . "lang/lang.php");
include_once (_CORE_PATH . "MozgSource.php");
include_once (_CORE_PATH . "MozgProperty.php");
include_once (_CORE_PATH . "controller/controller_prototype.php");
include_once (_CORE_PATH . "request/model_request.php");
include_once (_CORE_PATH . "response/model_response.php");
include_once (_CORE_PATH . "module/module_collection.php");
include_once (_CORE_PATH . 'request/request_collection.php');
include_once (_CORE_PATH . 'auth/active_user.php');
include_once (_CORE_PATH . 'system_collections/libs_collection.php');
include_once (_CORE_PATH . 'system_collections/ctrls_collection.php');
include_once (_CORE_PATH . "params/params.php");
include_once (_CORE_PATH . "params/cfg.php");

final class SysLoader
{
    private function __construct ()
    {}
    static public function GetEnvStore ()
    {
        include_once (_CORE_PATH . 'env/env.php');
        return env_store::GetInstance();
    }
    static public function IsRightProt ($protName)
    {
        return self::GetEnvStore()->IsRightProt($protName);
    }
    static public function IsRightEnv ($protName, $envName)
    {
        return self::GetEnvStore()->IsRightEnv($protName, $envName);
    }

    /**
		объект запроса
     */
    static public function GetRequest ($protName)
    {
        return request_collection::GetRequest($protName);
    }
    /**
		объект ответа
     */
    static public function GetResponse($protName)
    {
        include_once (_CORE_PATH . 'response/response_' . $protName . '.php');
        $responseClassName = 'response_' . $protName;
        return new $responseClassName();
    }   
    
    /**
		объект активного юзера
     */
    static public function GetUser ()
    {
        return new active_user_class();
    }
    /**
		возвращает коллекцию модулей
     */
    static public function GetModuleCollection()
    {
        return module_collection::GetInstance();
    }
    
    /**
		создает модуль
     */
    static public function GetModule ($name, $protocol, $env, $user = null)
    {
        return self::GetModuleCollection()->GetModule($name, $protocol, $env, $user);
    }

    /**
		возвращает путь к модулю
     */
    static public function GetModPath ($modName)
    {
        return _APP_PATH . 'business/' . $modName . '/';
    }
    /**
		создаёт объект контроллера
     */
    static public function GetCtrl ($ctrlName, active_module_class $module)
    {
        if (! $module->IsCtrlExists($ctrlName)) throw new Exception('Неизвестный контроллер ' . $ctrlName);
        $ctrlClassNameEnv = $ctrlName . '_' . $module->GetName() . '_' . $module->GetProt() . $module->GetEnv();
        $ctrlNameEnv = $ctrlName . '_' . $module->GetName() . '_' . $module->GetProt() . $module->GetEnv();
        include_once ($module->GetCtrlPath($ctrlName) . $ctrlNameEnv . '.php');
        return new $ctrlClassNameEnv($module, $ctrlName);
    }
    static public function IsCtrlExists($moduleName, $ctrlName, $protName = false, $envName = false)
    {
        if (false === $protName xor false === $envName)
        {
            throw new Exception('Не задана среда или окружение');            
        }
        elseif (false === $protName && false === $envName)
        {
            return is_dir(self::GetCtrlPath ($moduleName, $ctrlName)); 
        } 

        return is_file(self::GetCtrlPath ($moduleName, $ctrlName).$ctrlName . '_' . $moduleName . '_' . $protName . $envName. '.php');
    }
    static public function GetCtrlPath ($moduleName, $ctrlName)
    {
        return self::GetModuleCollection()->GetModulePath($moduleName) . 'controllers/' . $ctrlName . '/';
    }    
    /**
		создаёт объект библиотеки
     */
    static public function GetLib ($libName)
    {
        if (! self::IsLibExists($libName))
            throw new Exception('Класс ' . $libName . ' не найден');
        include_once (_CORE_PATH . 'libs/lib.' . $libName . '.php');
        $libClassName = $libName . '_class';
        return new $libClassName();
    }
    /**
		проверяет, существует ли библиотека
     */
    static public function IsLibExists ($libName)
    {
        return is_file(_CORE_PATH . 'libs/lib.' . $libName . '.php');
    }
    /**
		работа с коллекциями системных объектов: модели, контроллеры, библиотеки
     */
    static public function GetLibCollection ()
    {
        return libs_collection_class::GetInstance();
    }
    static public function GetCtrlCollection (active_module_class $module)
    {
        return ctrls_collection_class::GetInstance($module);
    }
    /**
		создаёт и возвращает декоратор
     */
    static public function GetDecorator (active_module_class $module)
    {
        if (! is_file($module->GetPath() . 'decorator.php'))
            throw new Exception('Не найден декоратор');
        include_once ($module->GetPath() . 'decorator.php');
        $decorClassName = 'decorator_' . $module->GetName();
        return new $decorClassName($module);
    }
    /**
		загружаем шаблонизатор
     */
    static function GetTemplator ($module, $basePath)
    {
        include_once (_CORE_PATH . 'templator.php');
        return new templator_class($module, $basePath);
    }

    /**
		объект запроса для передачи данных в модель
     */
    static function GetModRequest ()
    {
        return new model_request();
    }
    /**
		объект ответа для передачи данных из модели
     */
    static function GetModResponse ()
    {
        return new model_response();
    }
    
    static function GetCtrlExt(controller_prototype_class $ctrlObj)
    {
    	$module = $ctrlObj->GetModule();
    	$ctrlName = $ctrlObj->GetSelfName();
        $extClassName = $ctrlName . '_' . $module->GetName() . '_external';
        $extName = $ctrlName . '_' . $module->GetName() . '_external';
        include_once ($module->GetCtrlPath($ctrlName) . $extName . '.php');
        return new $extClassName($ctrlObj);    	
    }
}